package com.halfsword.creativecraft.datagen.loot;

import com.halfsword.creativecraft.block.BlockLoader;
import com.halfsword.creativecraft.block.custom.BlueBerryCropBlock;
import com.halfsword.creativecraft.block.custom.SorghumCropBlock;
import com.halfsword.creativecraft.item.ItemLoader;
import net.minecraft.advancements.critereon.StatePropertiesPredicate;
import net.minecraft.data.loot.BlockLootSubProvider;
import net.minecraft.world.flag.FeatureFlags;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.enchantment.Enchantments;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.storage.loot.LootTable;
import net.minecraft.world.level.storage.loot.entries.LootItem;
import net.minecraft.world.level.storage.loot.functions.ApplyBonusCount;
import net.minecraft.world.level.storage.loot.functions.SetItemCountFunction;
import net.minecraft.world.level.storage.loot.predicates.LootItemBlockStatePropertyCondition;
import net.minecraft.world.level.storage.loot.predicates.LootItemCondition;
import net.minecraft.world.level.storage.loot.providers.number.UniformGenerator;
import net.minecraftforge.registries.RegistryObject;

import java.util.Map;
import java.util.Set;

/**
 * 方块战利品表数据生成器
 *
 * <p>DeepSeek 提供以下核心注释：</p>
 * <ul>
 *   <li>定义各种方块的掉落规则</li>
 *   <li>处理矿石、农作物等特殊掉落逻辑</li>
 *   <li>支持时运附魔影响掉落数量</li>
 *   <li>自动生成所有注册方块的战利品表</li>
 * </ul>
 *
 * <p>扩展说明：</p>
 * 1. 继承自 Minecraft 的 BlockLootSubProvider，用于数据生成<br>
 * 2. 通过 generate() 方法集中定义所有方块的掉落规则<br>
 * 3. 支持特殊方块（如矿石、农作物、台阶、门）的定制化掉落逻辑<br>
 * 4. 自动注册所有在 BlockLoader 中注册的方块
 */
public class BlockLootTables extends BlockLootSubProvider {

    /**
     * 构造函数 - DeepSeek 注释
     * <p>初始化战利品表生成器，设置特性标志</p>
     *
     * 扩展说明：
     * - 调用父类构造函数，传入空的物品集和所有注册的特性标志
     * - 确保兼容当前 Minecraft 版本的所有特性
     */
    public BlockLootTables() {
        super(Set.of(), FeatureFlags.REGISTRY.allFlags());
    }

    /**
     * 生成所有方块的战利品表 - DeepSeek 注释
     * <p>为每个注册的方块定义掉落规则</p>
     *
     * 实现细节：
     * 1. 基础方块：直接掉落自身（使用 dropSelf()）
     * 2. 矿石：使用自定义矿石掉落逻辑（createOreDrops()）
     * 3. 功能方块：特殊处理台阶、门等方块
     * 4. 农作物：根据成熟状态定义掉落物
     */
    @Override
    protected void generate() {
        // ===== 基础方块处理 =====
        // 直接掉落方块自身（无特殊逻辑）
        this.dropSelf(BlockLoader.BLOCK_SPACE.get());
        this.dropSelf(BlockLoader.BLOCK_RAW_SPACE.get());
        this.dropSelf(BlockLoader.BLOCK_SPACE_RESONANCE.get());
        this.dropSelf(BlockLoader.BLOCK_TITANIUM.get());
        this.dropSelf(BlockLoader.SPACE_SHARD_COLLECTOR_MACHINE.get());
        this.dropSelf(BlockLoader.STEAM_POWER_CRUSHER_MACHINE.get());


        // ===== 矿石处理 =====
        // 使用自定义矿石掉落方法，处理时运附魔和爆炸衰减
        this.add(BlockLoader.ORE_SPACE.get(),
                block-> createOreDrops(BlockLoader.ORE_SPACE.get(), ItemLoader.RAWSPACE.get()));
        this.add(BlockLoader.DEEPSLATE_ORE_SPACE.get(),
                block-> createOreDrops(BlockLoader.DEEPSLATE_ORE_SPACE.get(), ItemLoader.RAWSPACE.get()));
        this.add(BlockLoader.END_ORE_SPACE.get(),
                block-> createOreDrops(BlockLoader.END_ORE_SPACE.get(), ItemLoader.RAWSPACE.get()));
        this.add(BlockLoader.NETHER_ORE_SPACE.get(),
                block-> createOreDrops(BlockLoader.NETHER_ORE_SPACE.get(), ItemLoader.RAWSPACE.get()));

        // ===== 功能方块处理 =====
        // 直接掉落自身（楼梯、压力板等）
        this.dropSelf(BlockLoader.STAIRS_SPACE.get());
        this.dropSelf(BlockLoader.SLAB_SPACE.get()); // 注意：下方有特殊处理覆盖
        this.dropSelf(BlockLoader.PRESSURE_PLATE_SPACE.get());
        this.dropSelf(BlockLoader.TRAPDOOR_SPACE.get());
        this.dropSelf(BlockLoader.FENCE_SPACE.get());
        this.dropSelf(BlockLoader.FENCE_GATE_SPACE.get());
        this.dropSelf(BlockLoader.WALL_SPACE.get());
        this.dropSelf(BlockLoader.BUTTON_SPACE.get());

        // ===== 特殊方块处理 =====
        // 台阶方块：需要特殊处理（掉落单个台阶物品）
        // 注意：覆盖上方的 dropSelf() 调用
        this.add(BlockLoader.SLAB_SPACE.get(),
                block -> createSlabItemTable(BlockLoader.SLAB_SPACE.get()));

        // 门：需要特殊处理（掉落门:物品）
        this.add(BlockLoader.DOOR_SPACE.get(),
                block -> createDoorTable(BlockLoader.DOOR_SPACE.get()));

        // ===== 农作物处理 =====
        // 蓝莓作物：仅在成熟时(AGE=5)掉落蓝莓果实和种子
        LootItemCondition.Builder blueberryCondition = LootItemBlockStatePropertyCondition
                .hasBlockStateProperties(BlockLoader.BLUEBERRY_CROP.get())
                .setProperties(StatePropertiesPredicate.Builder.properties()
                        .hasProperty(BlueBerryCropBlock.AGE, 5)); // 成熟阶段

        this.add(BlockLoader.BLUEBERRY_CROP.get(),
                createCropDrops(
                        BlockLoader.BLUEBERRY_CROP.get(),
                        ItemLoader.BLUEBERRY.get(),        // 主要掉落物：蓝莓果实
                        ItemLoader.BLUEBERRY_SEEDS.get(),  // 额外掉落：蓝莓种子
                        blueberryCondition                 // 成熟条件
                ));

        // 高粱作物：仅在成熟时(AGE=8)掉落高粱籽粒和种子
        LootItemCondition.Builder sorghumCondition = LootItemBlockStatePropertyCondition
                .hasBlockStateProperties(BlockLoader.SORGHUM_CROP.get())
                .setProperties(StatePropertiesPredicate.Builder.properties()
                        .hasProperty(SorghumCropBlock.AGE, 8)); // 成熟阶段

        this.add(BlockLoader.SORGHUM_CROP.get(),
                createCropDrops(
                        BlockLoader.SORGHUM_CROP.get(),
                        ItemLoader.SORGHUM.get(),       // 主要掉落物：高粱籽粒
                        ItemLoader.SORGHUM_SEEDS.get(), // 额外掉落：高粱种子
                        sorghumCondition                // 成熟条件
                ));
        this.dropSelf(BlockLoader.CALENDULA.get());//金盏花
        this.add(BlockLoader.POTTED_CALENDULA.get(),createPotFlowerItemTable(BlockLoader.CALENDULA.get()));//带盆金盏花掉落金盏花
    }

    /**
     * 创建矿石掉落表 - DeepSeek 注释
     *
     * <p>特殊掉落规则：</p>
     * <ul>
     *   <li>精准采集时掉落方块本身</li>
     *   <li>普通采集时掉落1-2个矿石物品</li>
     *   <li>受时运附魔影响增加掉落数量</li>
     *   <li>考虑爆炸衰减（被TNT破坏时）</li>
     * </ul>
     *
     * @param block 目标方块
     * @param item  掉落的物品
     * @return 战利品表构建器
     *
     * 实现细节：
     * 1. createSilkTouchDispatchTable：处理精准采集逻辑
     * 2. applyExplosionDecay：处理爆炸破坏时的数量衰减
     * 3. SetItemCountFunction：设置基础掉落数量范围
     * 4. ApplyBonusCount：应用时运附魔效果
     */
    protected LootTable.Builder createOreDrops(Block block, Item item) {
        return createSilkTouchDispatchTable(
                block,
                this.applyExplosionDecay(
                        block,
                        LootItem.lootTableItem(item)
                                .apply(SetItemCountFunction.setCount(UniformGenerator.between(1.0F, 2.0F))) // 基础掉落1-2个
                                .apply(ApplyBonusCount.addOreBonusCount(Enchantments.BLOCK_FORTUNE)) // 时运附魔加成
                ));
    }

    /**
     * 获取所有已知方块 - DeepSeek 注释
     * <p>用于自动生成未定义战利品表的方块</p>
     *
     * @return 所有注册方块的迭代器
     *
     * 实现机制：
     * 1. 从 BlockLoader 获取所有注册的方块
     * 2. 将 RegistryObject 转换为实际 Block 对象
     * 3. 确保所有方块都有对应的战利品表
     */
    @Override
    protected Iterable<Block> getKnownBlocks() {
        return BlockLoader.BLOCKS.getEntries().stream().map(RegistryObject::get)::iterator;
    }
}